package cn.hchaojie.javase.day09;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;

// 数组的问题：必须指定大小。长度没办法改变
public class TestList {
	// 测试先行
	@Test
	public void test1() {
		int[] array = findPrimesIn100();
		System.out.println(Arrays.toString(array));
		
		List list = findPrimesIn100WithList();
		System.out.println(list);
	}
	
	// 原始类型
	public static List findPrimesIn100WithList() {
		// 定义一个结果集
		List result = new ArrayList(); 
		
		for (int i = 2; i <= 100; i++) {
			// 如果i是质数，添加到结果集
			if (isPrime(i)) {
				result.add(i);
			}
		}
		
		// 返回结果集
		return result;
	}
	
	// 使用泛型，指定集合容器里面的数据类型
	public static List<Integer> findPrimesIn100WithList2() {
		// 定义一个结果集
		// 泛型必须是对象类型，不能是基本类型
		// 对于每种基本类型，都有对应的对象类型，一般叫它们“基本类型的包装类型”
		// List<Integer> result = new ArrayList<Integer>(); 
		List<Integer> result = new ArrayList<>(); 
		
		for (int i = 2; i <= 100; i++) {
			// 如果i是质数，添加到结果集
			if (isPrime(i)) {
				result.add(i);
			}
		}
		
		// 返回结果集
		return result;
	}
	
	// generic type
	@Test
	public void test2() {
		List<String> list = new ArrayList<>();
		
		list.add("abc");
		list.add("bcd");
		
		
		Map<String, Integer> map = new HashMap<>();
		map.put("first", 12);
		map.put("second", 13);
		map.put("third", 14);
		
		System.out.println(map.get("third"));
		
		// -1649880310
		System.out.println(15 ^ -1649880310);
		
		int h1 = "first".hashCode();
		int h2 = "second".hashCode();
		int h3 = "third".hashCode();
		System.out.println((16 - 1) & (h1 ^ h1 >>> 16));
		System.out.println((16 - 1) & (h2 ^ h2 >>> 16));
		System.out.println((16 - 1) & (h3 ^ h3 >>> 16));
	}
	
	// 伪代码（实现的思路）
	// 写一个方找出100以内的所有质数并返回。
	public static int[] findPrimesIn100() {
		// 定义一个结果集
		int[] result = new int[100];
		int index = 0;
		
		for (int i = 2; i <= 100; i++) {
			// 如果i是质数，添加到结果集
			if (isPrime(i)) {
				result[index] = i;
				index++;
			}
		}
		
		int[] data = new int[index];
		for (int i = 0; i < index; i++) {
			data[i] = result[i];
		}
		
		// 返回结果集
		return data;
	}
	
	private static boolean isPrime(int number) {
		for (int i = 2; i < number / 2; i++) {
			if (number % i == 0) {
				return false;
			}
		}
		
		return true;
	}
}
